package com.kaifamiao.poly;

// 定义引用变量时为引用变量指定的类型被称作【编译时类型】
public class Sinaean extends Human {

    public Sinaean() {
        super();
    }

    public Sinaean(String name) {
        super(name);
    }

    @Override
    public void eat(String food){
        logger.info( String.format("中国人%s正在用筷子吃%s", name, food));
    }

    public void dancing(){
        logger.info("很多中国人喜欢跳广场舞");
    }

    public void  taiChi(){
        logger.info("很多中国人喜欢打太极拳");
    }

    public static void main(String[] args) {
        // 声明一个 Human 类型引用变量
        Human h = null ; // 引用变量 h 的编译时类型是 Human

        // 父类类型的引用变量(h)指向了子类(Sinaean)类型的实例
        h = new Sinaean( "张翠山" );

        // 声明变量时所指定的类型决定了可以通过该变量访问那些字段和调用那些方法
        h.eat( "老碗鱼" );
        System.out.println( h.toString() );
        // h.taiChi(); // 编译失败: Cannot resolve method 'taiChi' in 'Human'
        // h.dancing(); // 编译失败

        // 引用类型的强制类型转换
        Sinaean s = (Sinaean)h; // 引用变量 s 的编译时类型是 Sinaean
        // 编译时类型 决定了通过引用变量可以访问那些字段、可以调用那些方法
        s.eat( "三秦套餐" );
        s.taiChi();
        s.dancing();

    }
}
